#pragma once
#include "Util.hpp"
#include <iostream>
#include <unordered_map>
#include <websocketpp/server.hpp>
#include <websocketpp/config/asio_no_tls.hpp>
typedef websocketpp::server<websocketpp::config::asio> websocketsvr;//代表了一个使用 ASIO 作为网络传输层的 WebSocket 服务器类型。websocketpp::server 是 WebSocket++ 库中的一个模板类，用于创建 WebSocket 服务器
class online_manager
{
private:
    std::mutex _mutex;
    // 游戏大厅用户ID与通信连接联系
    std::unordered_map<uint64_t, websocketsvr::connection_ptr> _hall_user;
    // 游戏房间用户ID与通信连接关系
    std::unordered_map<uint64_t, websocketsvr::connection_ptr> _room_user;

public:
    // websocket建立连接时才会加入游戏大厅&游戏房间在线用户管理
    void enter_game_hall(uint64_t uid, websocketsvr::connection_ptr &con)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.insert(std::make_pair(uid, con));
    }
    void enter_game_room(uint64_t uid, websocketsvr::connection_ptr &con)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.insert(std::make_pair(uid, con));
    }
    // websocket断开连接时,会移除游戏大厅&游戏房间在线用户管理
    void exit_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.erase(uid);
    }
    void exit_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.erase(uid);
    }
    // 判断当前用户是否在游戏大厅中/游戏房间中
    bool is_in_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto item = _hall_user.find(uid);
        if (item == _hall_user.end())
        {
            return false;
        }
        return true;
    }
    bool is_in_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto item = _room_user.find(uid);
        if (item == _room_user.end())
        {
            return false;
        }
        return true;
    }
    // 通过用户ID在游戏大厅/游戏房间用户管理中获得对应的通信连接
    websocketsvr::connection_ptr get_conn_from_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto item = _hall_user.find(uid);
        if (item == _room_user.end())
        {
            return websocketsvr::connection_ptr();
        }
        return item->second;
    }
    websocketsvr::connection_ptr get_conn_from_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto item = _room_user.find(uid);
        if (item == _room_user.end())
        {
            return websocketsvr::connection_ptr();
        }
        return item->second;
    }
};
